LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgcm91dGluZXMgcmVxdWlyZWQgdG8gcGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqICAgbGlzdGVkIGluIGEgY29uZmlnIGZpbGUsIGlmIHRoYXQgY29uZmlnIGZpbGUgZXhpc3RzLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBPbmx5IGluY2x1ZGUgdGhpcyBmaWxlIGlmIFVTRV9QUk9GSUxFIGlzIGRlZmluZWQgKi8KI2lmZGVmIFVTRV9QUk9GSUxFCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIHBhcnNlIGNvbmZpZyBmaWxlICovCiNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKI2RlZmluZSBCSU5fREwgMQoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KLy8jaW5jbHVkZSA8aGNmZGVmLmg+CgojaW5jbHVkZSA8d2xfaWYuaD4KI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CiNpbmNsdWRlIDx3bF91dGlsLmg+CiNpbmNsdWRlIDx3bF9lbmMuaD4KI2luY2x1ZGUgPHdsX21haW4uaD4KI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBEZWZpbml0aW9uIG5lZWRlZCB0byBwcmV2ZW50IHVucmVzb2x2ZWQgZXh0ZXJuYWwgaW4gdW5pc3RkLmggKi8Kc3RhdGljIGludCBlcnJubzsKCiNpZiBEQkcKZXh0ZXJuIHBfdTMyICAgIERlYnVnRmxhZzsKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CiNlbmRpZgoKaW50IHBhcnNlX3llc19ubyggY2hhciogdmFsdWUgKTsKCgppbnQgcGFyc2VfeWVzX25vKCBjaGFyKiB2YWx1ZSApIHsKaW50IHJjID0gMDsJCQkJCQkJCQkJLy9kZWZhdWx0IHRvIE5PIGZvciBpbnZhbGlkIHBhcmFtZXRlcnMKCglpZiAoIHN0cmxlbiggdmFsdWUgKSA9PSAxICkgewoJCWlmICggKCB2YWx1ZVswXSB8ICgnWSdeJ3knKSApID09ICd5JyApIHJjID0gMTsKLy8JfSBlbHNlIHsKLy8JCXRoaXMgc2hvdWxkIG5vdCBiZSBkZWJ1ZyB0aW1lIGluZm8sIGl0IGlzIGFuIGVuZHVzZXIgZGF0YSBlbnRyeSBlcnJvciA7PwovLwkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUyApOwoJfQoJcmV0dXJuIHJjOwp9IC8vIHBhcnNlX3llc19ubwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXBhcnNlX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBkZXZpY2UncyBjb25maWcgZmlsZSBhbmQgcGFyc2VzIHRoZSBvcHRpb25zIGZyb20KICogICBpdCwgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgY29uZmlndXJlIGl0c2VsZi4gSWYgbm8gY29uZmlndXJhdGlvbiBmaWxlCiAqICAgb3IgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgb3B0aW9ucyBhbHJlYWR5CiAqICAgcGFyc2VkIGZyb20gY29uZmlnLm9wdHMgb3Igd2lyZWxlc3Mub3B0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBwYXJzZV9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CglpbnQJCQkJICAgIGZpbGVfZGVzYzsKI2lmIDAgLy8gQklOX0RMCglpbnQgCSAJCQlyYzsKCWNoYXIJCQkJKmNwID0gTlVMTDsKI2VuZGlmIC8vIEJJTl9ETAoJY2hhciAgICAgICAgICAgICAgICBidWZmZXJbTUFYX0xJTkVfU0laRV07CgljaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW01BWF9MSU5FX1NJWkVdOwoJbW1fc2VnbWVudF90CSAgICBmczsKCXN0cnVjdCB3bF9wcml2YXRlICAgKnd2bGFuX2NvbmZpZyA9IE5VTEw7CglFTkNTVFJDVCAgICAgICAgICAgIHNFbmNyeXB0aW9uOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAicGFyc2VfY29uZmlnIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJLyogR2V0IHRoZSB3YXZlbGFuIHNwZWNpZmljIGluZm8gZm9yIHRoaXMgZGV2aWNlICovCgl3dmxhbl9jb25maWcgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXY7CglpZiAoIHd2bGFuX2NvbmZpZyA9PSBOVUxMICkgewoJCURCR19FUlJPUiggRGJnSW5mbywgIldhdmVsYW4gc3BlY2lmaWMgaW5mbyBzdHJ1Y3Qgbm90IHByZXNlbnQ/XG4iICk7CgkJcmV0dXJuOwoJfQoKCS8qIHNldHVwIHRoZSBkZWZhdWx0IGVuY3J5cHRpb24gc3RyaW5nICovCglzdHJjcHkoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCBERUZfQ1JZUFRfU1RSICk7CgoJLyogT2J0YWluIGEgdXNlci1zcGFjZSBwcm9jZXNzIGNvbnRleHQsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KCWZzID0gZ2V0X2ZzKCApOwoJc2V0X2ZzKCBnZXRfZHMoICkpOwoKCS8qIERldGVybWluZSB0aGUgZmlsZW5hbWUgZm9yIHRoaXMgZGV2aWNlIGFuZCBhdHRlbXB0IHRvIG9wZW4gaXQgKi8KCXNwcmludGYoIGZpbGVuYW1lLCAiJXMlcyIsIFJPT1RfQ09ORklHX0ZJTEVOQU1FLCBkZXYtPm5hbWUgKTsKCWZpbGVfZGVzYyA9IG9wZW4oIGZpbGVuYW1lLCBPX1JET05MWSwgMCApOwoJaWYgKCBmaWxlX2Rlc2MgIT0gLTEgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiV2lyZWxlc3MgY29uZmlnIGZpbGUgZm91bmQuIFBhcnNpbmcgb3B0aW9ucy4uLlxuIiApOwoKCQkvKiBSZWFkIG91dCB0aGUgb3B0aW9ucyAqLwoJCXdoaWxlKCByZWFkbGluZSggZmlsZV9kZXNjLCBidWZmZXIgKSkgewoJCQl0cmFuc2xhdGVfb3B0aW9uKCBidWZmZXIsIHd2bGFuX2NvbmZpZyApOwoJCX0KCQkvKiBDbG9zZSB0aGUgZmlsZSAqLwoJCWNsb3NlKCBmaWxlX2Rlc2MgKTsJLy87P2V2ZW4gaWYgZmlsZV9kZXNjID09IC0xID8/PwoJfSBlbHNlIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBpd2NvbmZpZyBmaWxlIGZvdW5kIGZvciB0aGlzIGRldmljZTsgIgoJCQkJICAgImNvbmZpZy5vcHRzIG9yIHdpcmVsZXNzLm9wdHMgd2lsbCBiZSB1c2VkXG4iICk7Cgl9CgkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KCXNldF9mcyggZnMgKTsKCgkvKiBjb252ZXJ0IHRoZSBXRVAga2V5cywgaWYgcmVhZCBpbiBhcyBrZXkxLCBrZXkyLCB0eXBlIG9mIGRhdGEgKi8KCWlmICggd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uICkgewoJCW1lbXNldCggJnNFbmNyeXB0aW9uLCAwLCBzaXplb2YoIHNFbmNyeXB0aW9uICkpOwoKCQl3bF93ZXBfZGVjb2RlKCBDUllQVF9DT0RFLCAmc0VuY3J5cHRpb24sCgkJCQkJCSAgIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICk7CgoJCS8qIHRoZSBMaW51eCBkcml2ZXIgbGlrZXMgdG8gdXNlIDEtNCBmb3IgdGhlIGtleSBJRHMsIGFuZCB0aGVuCgkJICAgY29udmVydCB0byAwLTMgd2hlbiBzZW5kaW5nIHRvIHRoZSBjYXJkLiAgVGhlIFdpbmRvd3MgY29kZQoJCSAgIGJhc2UgdXNlZCAwLTMgaW4gdGhlIEFQSSBETEwsIHdoaWNoIHdhcyBwb3J0ZWQgdG8gTGludXguICBGb3IKCQkgICB0aGUgc2FrZSBvZiB0aGUgdXNlciBleHBlcmllbmNlLCB3ZSBkZWNpZGVkIHRvIGtlZXAgMC0zIGFzIHRoZQoJCSAgIG51bWJlcnMgdXNlZCBpbiB0aGUgRExMOyBhbmQgd2lsbCBwZXJmb3JtIHRoZSArMSBjb252ZXJzaW9uIGhlcmUuCgkJICAgV2UgY291bGQgaGF2ZSBjb252ZXJ0ZWQgIHRoZSBlbnRpcmUgTGludXggZHJpdmVyLCBidXQgdGhpcyBpcwoJCSAgIGxlc3Mgb2J0cnVzaXZlLiAgVGhpcyBtYXkgYmUgYSAidG9kbyIgdG8gY29udmVydCB0aGUgd2hvbGUgZHJpdmVyICovCgkJc0VuY3J5cHRpb24ud0VuYWJsZWQgPSB3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb247CgkJc0VuY3J5cHRpb24ud1R4S2V5SUQgPSB3dmxhbl9jb25maWctPlRyYW5zbWl0S2V5SUQgLSAxOwoKCQltZW1jcHkoICZzRW5jcnlwdGlvbi5FbmNTdHIsICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLAoJCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOwoKCQltZW1zZXQoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2YoIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uICkpOwoKCQl3bF93ZXBfY29kZSggQ1JZUFRfQ09ERSwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sICZzRW5jcnlwdGlvbiwKCQkJCQkJIHNpemVvZiggc0VuY3J5cHRpb24gKSk7Cgl9CgoJLyogZGVjb2RlIHRoZSBlbmNyeXB0aW9uIHN0cmluZyBmb3IgdGhlIGNhbGwgdG8gd2xfY29tbWl0KCkgKi8KCXdsX3dlcF9kZWNvZGUoIENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24gKTsKCgl3dmxhbl9jb25maWctPlRyYW5zbWl0S2V5SUQgICAgPSBzRW5jcnlwdGlvbi53VHhLZXlJRCArIDE7Cgl3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb24gPSBzRW5jcnlwdGlvbi53RW5hYmxlZDsKCgltZW1jcHkoICZ3dmxhbl9jb25maWctPkRlZmF1bHRLZXlzLCAmc0VuY3J5cHRpb24uRW5jU3RyLAoJCQlzaXplb2YoIENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKSk7CgojaWYgMCAvL0JJTl9ETAoJCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCgkJZnMgPSBnZXRfZnMoICk7CgkJc2V0X2ZzKCBnZXRfZHMoICkpOwoKCQkvLzs/anVzdCB0byBmYWtlIHNvbWV0aGluZwoJCXN0cmNweSgvKnd2bGFuX2NvbmZpZy0+ZndfaW1hZ2VfKi9maWxlbmFtZSwgIi9ldGMvYWdlcmUvZncuYmluIiApOwoJCWZpbGVfZGVzYyA9IG9wZW4oIC8qd3ZsYW5fY29uZmlnLT5md19pbWFnZV8qL2ZpbGVuYW1lLCAwLCAwICk7CgkJaWYgKCBmaWxlX2Rlc2MgPT0gLTEgKSB7CgkJCURCR19FUlJPUiggRGJnSW5mbywgIk5vIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKCQl9IGVsc2UgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBmb3VuZFxuIiApOwojZGVmaW5lIERIRl9BTExPQ19TSVpFIDk2MDAwCQkJLy9qdXN0IGJlbG93IDk2SywgbGV0J3MgaG9wZSBpdCBzdWZmaWNlcyBmb3Igbm93IGFuZCBmb3IgdGhlIGZ1dHVyZQoJCQljcCA9IChjaGFyKil2bWFsbG9jKCBESEZfQUxMT0NfU0laRSApOwoJCQlpZiAoIGNwID09IE5VTEwgKSB7CgkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJlcnJvciBpbiB2bWFsbG9jXG4iICk7CgkJCX0gZWxzZSB7CgkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgY3AsIERIRl9BTExPQ19TSVpFICk7CgkJCQlpZiAoIHJjID09IERIRl9BTExPQ19TSVpFICkgewoJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImJ1ZmZlciB0b28gc21hbGwsICVkXG4iLCBESEZfQUxMT0NfU0laRSApOwoJCQkJfSBlbHNlIGlmICggcmMgPiAwICkgewoJCQkJCURCR19UUkFDRSggRGJnSW5mbywgInJlYWQgTy5LLjogJWQgYnl0ZXMgICUuMTJzXG4iLCByYywgY3AgKTsKCQkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgJmNwW3JjXSwgMSApOwoJCQkJCWlmICggcmMgPT0gMCApIHsKCQkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAibm8gbW9yZSB0byByZWFkXG4iICk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCByYyAhPSAwICkgewoJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImZpbGUgbm90IHJlYWQgaW4gb25lIHN3b29wIG9yIG90aGVyIGVycm9yIlwKCQkJCQkJCQkJCSIsIGdpdmUgdXAsIHRvbyBjb21wbGljYXRlZCwgcmMgPSAlMFhcbiIsIHJjICk7CgkJCQl9CgkJCQl2ZnJlZSggY3AgKTsKCQkJfQoJCQljbG9zZSggZmlsZV9kZXNjICk7CgkJfQoJCXNldF9mcyggZnMgKTsJCQkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KI2VuZGlmIC8vIEJJTl9ETAoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwp9IC8vIHBhcnNlX2NvbmZpZwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJcmVhZGxpbmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBpbiBkYXRhIGZyb20gYSBnaXZlbiBmaWxlIG9uZSBsaW5lIGF0IGEgdGltZSwKICogICBjb252ZXJ0aW5nIHRoZSBkZXRlY3RlZCBuZXdsaW5lIGNoYXJhY3RlciAnXG4nIHRvIGEgbnVsbCAnXDAnLiBOb3RlIHRoYXQKICogICB0aGUgZmlsZSBkZXNjcmlwdG9yIG11c3QgYmUgdmFsaWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZmlsZWRlc2MgICAgLSB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUKICogICAgICBidWZmZXIgICAgICAtIGEgYnVmZmVyIHBvaW50ZXIsIHBhc3NlZCBpbiBieSB0aGUgY2FsbGVyLCB0byB3aGljaCB0aGUKICogICAgICAgICAgICAgICAgICAgIGxpbmUgd2lsbCBiZSBzdG9yZWQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAogKiAgICAgIC0xIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCByZWFkbGluZSggaW50IGZpbGVkZXNjLCBjaGFyICpidWZmZXIgKQp7CglpbnQgcmVzdWx0ID0gLTE7CglpbnQgYnl0ZXNfcmVhZCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJLyogTWFrZSBzdXJlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgZ29vZCAqLwoJaWYgKCBmaWxlZGVzYyAhPSAtMSApIHsKCQkvKiBSZWFkIGluIGZyb20gdGhlIGZpbGUgYnl0ZSBieSBieXRlIHVudGlsIGEgbmV3bGluZSBpcyByZWFjaGVkICovCgkJd2hpbGUoKCByZXN1bHQgPSByZWFkKCBmaWxlZGVzYywgJmJ1ZmZlcltieXRlc19yZWFkXSwgMSApKSA9PSAxICkgewoJCQlpZiAoIGJ1ZmZlcltieXRlc19yZWFkXSA9PSAnXG4nICkgewoJCQkJYnVmZmVyW2J5dGVzX3JlYWRdID0gJ1wwJzsKCQkJCWJ5dGVzX3JlYWQrKzsKCQkJCWJyZWFrOwoJCQl9CgkJCWJ5dGVzX3JlYWQrKzsKCQl9Cgl9CgoJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwoJaWYgKCByZXN1bHQgPT0gLTEgKSB7CgkJcmV0dXJuIHJlc3VsdDsKCX0gZWxzZSB7CgkJcmV0dXJuIGJ5dGVzX3JlYWQ7Cgl9Cn0gLy8gcmVhZGxpbmUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXRyYW5zbGF0ZV9vcHRpb24oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpbmUgcmVhZCBpbiBmcm9tIHRoZSBjb25maWcgZmlsZSBhbmQgcGFyc2VzIG91dAogKiAgIHRoZSBrZXkvdmFsdWUgcGFpcnMuIEl0IHRoZW4gZGV0ZXJtaW5lcyB3aGljaCBrZXkgaGFzIGJlZW4gcGFyc2VkIGFuZCBzZXRzCiAqICAgdGhlIGNhcmQncyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBnaXZlbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgYnVmZmVyIC0gYSBidWZmZXIgY29udGFpbmluZyBhIGxpbmUgdG8gdHJhbnNsYXRlCiAqICAgICAgY29uZmlnIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHRyYW5zbGF0ZV9vcHRpb24oIGNoYXIgKmJ1ZmZlciwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJdW5zaWduZWQgaW50IHZhbHVlX2NvbnZlcnQgPSAwOwoJaW50IHN0cmluZ19sZW5ndGggPSAwOwoJY2hhciAqa2V5ID0gTlVMTDsKCWNoYXIgKnZhbHVlID0gTlVMTDsKCXVfY2hhciBtYWNfdmFsdWVbRVRIX0FMRU5dOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAidHJhbnNsYXRlX29wdGlvbiIgKTsKCglpZiAoIGJ1ZmZlciA9PSBOVUxMIHx8IGxwID09IE5VTEwgKSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQ29uZmlnIGZpbGUgYnVmZmVyIGFuZC9vciB3YXZlbGFuIGJ1ZmZlciBwdHIgTlVMTFxuIiApOwoJCXJldHVybjsKCX0KCglQYXJzZUNvbmZpZ0xpbmUoIGJ1ZmZlciwgJmtleSwgJnZhbHVlICk7CgoJaWYgKCBrZXkgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMICkgewoJCXJldHVybjsKCX0KCgkvKiBEZXRlcm1pbmUgd2hpY2gga2V5IGl0IGlzIGFuZCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gKi8KCgkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBpbiBhbGwgc2NlbmFyaW9zICovCiNpZiBEQkcKCS8qIGhhbmRsZSBEZWJ1Z0ZsYWcgYXMgZWFybHkgYXMgcG9zc2libGUgc28gaXQgc3RhcnRzIGl0cyBpbmZsdWVuY2UgYXMgZWFybHkKCSAqIGFzIHBvc3NpYmxlCgkgKi8KCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ERUJVR19GTEFHICkgPT0gMCApIHsKCQlpZiAoIERlYnVnRmxhZyA9PSB+MCApIHsJCQkvL2lmIERlYnVnRmxhZyBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKCQkJaWYgKCBEYmdJbmZvLT5EZWJ1Z0ZsYWcgPT0gMCApIHsJLyogaWYgcGNfZGVidWcgZGlkIG5vdCBzZXQgRGVidWdGbGFnIChpLmUucGNfZGVidWcgaXMKCQkJCQkJCQkJCQkgKiBub3Qgc3BlY2lmaWVkIG9yIHNwZWNpZmllZCBvdXRzaWRlIHRoZSA0LTggcmFuZ2UKCQkJCQkJCQkJCQkgKi8KCQkJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfREVGQVVMVFM7CgkJCX0KCQl9IGVsc2UgewoJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7IC8vOz9EZWJ1Z0ZsYWc7CgkJfQoJCURiZ0luZm8tPkRlYnVnRmxhZyA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsgLy87P0RlbGV0ZSBBU0FQCgl9CiNlbmRpZiAvKiBEQkcgKi8KCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0FVVEhfS0VZX01HTVRfU1VJVEUgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSApKSB7CgkJCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9CUlNDXzJHSFogKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9CUlNDXzJHSFosIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9CUlNDICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0JSU0MgKSkgewoJCQlscC0+YnJzY1swXSA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0JSU0NfMkdIWiApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0JSU0NfNUdIWiApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0JSU0NfNUdIWiwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0JSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQlJTQyApKSB7CgkJCWxwLT5icnNjWzFdID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQlJTQ181R0haICk7CgkJfQoJfQoJZWxzZSBpZiAoKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCApID09IDAgKSB8fCAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX1NTSUQgKSA9PSAwICkpIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTU0lELCB2YWx1ZTogJXNcbiIsIHZhbHVlICk7CgoJCW1lbXNldCggbHAtPk5ldHdvcmtOYW1lLCAwLCAoIFBBUk1fTUFYX05BTUVfTEVOICsgMSApKTsKCgkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLwoJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CgkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gUEFSTV9NQVhfTkFNRV9MRU4gKSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiU1NJRCB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIgKTsKCQkJc3RyaW5nX2xlbmd0aCA9IFBBUk1fTUFYX05BTUVfTEVOOwoJCX0KCgkJbWVtY3B5KCBscC0+TmV0d29ya05hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7Cgl9CiNpZiAwCgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRE9XTkxPQURfRklSTVdBUkUsIHZhbHVlOiAlc1xuIiwgdmFsdWUgKTsKCQltZW1zZXQoIGxwLT5md19pbWFnZV9maWxlbmFtZSwgMCwgKCBNQVhfTElORV9TSVpFICsgMSApKTsKCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCgkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKCQlpZiAoIHN0cmluZ19sZW5ndGggPiBNQVhfTElORV9TSVpFICkgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIG5hbWUgdG9vIGxvbmc7IHdpbGwgYmUgaWdub3JlZFxuIiApOwoJCX0gZWxzZSB7CgkJCW1lbWNweSggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCApOwoJCX0KCX0KI2VuZGlmCgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fRU5BQkxFX0VOQ1JZUFRJT04gKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSkgewoJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0VOQ1JZUFRJT04gKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9FTkNSWVBUSU9OLCB2YWx1ZSApOwoKCQltZW1zZXQoIGxwLT5zekVuY3J5cHRpb24sIDAsIHNpemVvZiggbHAtPnN6RW5jcnlwdGlvbiApKTsKCgkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLwoJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CgkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICkgKSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgdG9vIGxvbmc7IHdpbGwgYmUgdHJ1bmNhdGVkXG4iLCBQQVJNX05BTUVfRU5DUllQVElPTiApOwoJCQlzdHJpbmdfbGVuZ3RoID0gc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICk7CgkJfQoKCQltZW1jcHkoIGxwLT5zekVuY3J5cHRpb24sIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkxICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMSwgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVswXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVswXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTEgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkyICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMiwgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVsxXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsxXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTIgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkzICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMywgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVsyXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsyXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTMgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVk0ICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZNCwgdmFsdWUgKTsKCgkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CgkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVszXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOwoKCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVszXSApOwoJCX0gZWxzZSB7CgkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTQgKTsKCQl9Cgl9CgkvKiBOZXcgUGFyYW1ldGVycyBmb3IgV0FSUCAqLwoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9MT0FEX0JBTEFOQ0lORywgdmFsdWUgKTsKCQlscC0+bG9hZEJhbGFuY2luZyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUVESVVNX0RJU1RSSUJVVElPTiwgdmFsdWUgKTsKCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgdmFsdWUgKTsKCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX01VTFRJQ0FTVF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFICkpIHsKCQkJbHAtPk11bHRpY2FzdFJhdGVbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUgKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICggd2xfaXNfYV92YWxpZF9jaGFuKCB2YWx1ZV9jb252ZXJ0ICkpIHsKCQkJaWYgKCB2YWx1ZV9jb252ZXJ0ID4gMTQgKSB7CgkJCQl2YWx1ZV9jb252ZXJ0ID0gdmFsdWVfY29udmVydCB8IDB4MTAwOwoJCQl9CgkJCWxwLT5DaGFubmVsID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9DSEFOTkVMICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX05BTUUgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fTkFNRSwgdmFsdWUgKTsKCgkJbWVtc2V0KCBscC0+U3RhdGlvbk5hbWUsIDAsICggUEFSTV9NQVhfTkFNRV9MRU4gKyAxICkpOwoKCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCgkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKCQlpZiAoIHN0cmluZ19sZW5ndGggPiBQQVJNX01BWF9OQU1FX0xFTiApIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIsIFBBUk1fTkFNRV9PV05fTkFNRSApOwoJCQlzdHJpbmdfbGVuZ3RoID0gUEFSTV9NQVhfTkFNRV9MRU47CgkJfQoKCQltZW1jcHkoIGxwLT5TdGF0aW9uTmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGggKTsKCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJbHAtPlJUU1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEICk7CgkJfQoJfQoJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1JTQ18yR0haICkgPT0gMCApIHsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fU1JTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TUlNDICkpIHsKCQkJbHAtPnNyc2NbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9TUlNDXzJHSFogKTsKCQl9Cgl9CgllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9TUlNDXzVHSFogKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9TUlNDXzVHSFosIHZhbHVlICk7CgoJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TUlNDICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NSU0MgKSkgewoJCQlscC0+c3JzY1sxXSA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NSU0NfNUdIWiApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUgKSkgewoJCQlscC0+RGlzdGFuY2VCZXR3ZWVuQVBzID0gdmFsdWVfY29udmVydDsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX0tFWSApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX0tFWSwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX0tFWSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9LRVkgKSkgewoJCQlscC0+VHJhbnNtaXRLZXlJRCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQl9IGVsc2UgewoJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX0tFWSApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEUgKSA9PSAwICkgewoJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFLCB2YWx1ZSApOwoKCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSB2YWx1ZV9jb252ZXJ0OwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURSApOwoJCX0KCX0KCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCApID09IDAgKSB7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCwgdmFsdWUgKTsKCgkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1BPV19MRVZFTCApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9QT1dfTEVWRUwgKSkgewoJCQlscC0+dHhQb3dMZXZlbCA9IHZhbHVlX2NvbnZlcnQ7CgkJfSBlbHNlIHsKCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9QT1dfTEVWRUwgKTsKCQl9Cgl9CgoJLyogTmVlZCB0byBhZGQ/IDogQ291bnRyeSBjb2RlLCBTaG9ydC9Mb25nIHJldHJ5ICovCgoJLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIFNUQSBtb2RlICovCiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQovLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKCQkJCQkvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQoJCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QT1JUX1RZUEUgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUE9SVF9UWVBFLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCggdmFsdWVfY29udmVydCA9PSBQQVJNX01JTl9QT1JUX1RZUEUgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPT0gUEFSTV9NQVhfUE9SVF9UWVBFICkpIHsKCQkJCWxwLT5Qb3J0VHlwZSA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BPUlRfVFlQRSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1BNX0VOQUJMRUQgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUE1fRU5BQkxFRCwgdmFsdWUgKTsKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCS8qIDs/IGhvdyBhYm91dCB3bF9tYWluLmMgY29udGFpbmluZwoJICogVkFMSURfUEFSQU0oIFBBUk1fUE1fRU5BQkxFRCA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCB8fAoJICoJCQkJCSAoIFBBUk1fUE1fRU5BQkxFRCAmIDB4N0ZGRiApIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEICk7CgkgKi8KCQkJaWYgKCAoIHZhbHVlX2NvbnZlcnQgJiAweDdGRkYgKSA8PSBQQVJNX01BWF9QTV9FTkFCTEVEKSB7CgkJCQlscC0+UE1FbmFibGVkID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE1fRU5BQkxFRCApOwoJCQkJLy87P3RoaXMgaXMgYSBkYXRhIGVudHJ5IGVycm9yLCBoZW5jZSBub3QgYSBEQkdfV0FSTklORwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NSRUFURV9JQlNTICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCB2YWx1ZSApOwoJCQlscC0+Q3JlYXRlSUJTUyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlgsIHZhbHVlICk7CgkJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTUFYX1NMRUVQICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gMCApICYmICggdmFsdWVfY29udmVydCA8PSA2NTUzNSApKSB7CgkJCQlscC0+TWF4U2xlZXBEdXJhdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX05FVFdPUktfQUREUiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIsIHZhbHVlICk7CgoJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CgkJCQltZW1jcHkoIGxwLT5NQUNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX05FVFdPUktfQUREUiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9BVVRIRU5USUNBVElPTiApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9BVVRIRU5USUNBVElPTiApKSB7CgkJCQlscC0+YXV0aGVudGljYXRpb24gPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVyApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1csIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9BVElNX1dJTkRPVyApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9PV05fQVRJTV9XSU5ET1cgKSkgewoJCQkJbHAtPmF0aW1XaW5kb3cgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUE1fSE9MRE9WRVJfRFVSQVRJT04gKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUE1fSE9MRE9WRVJfRFVSQVRJT04gKSkgewoJCQkJbHAtPmhvbGRvdmVyRHVyYXRpb24gPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSwgdmFsdWUgKTsKCQkJbHAtPnByb21pc2N1b3VzTW9kZSA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0NPTk5FQ1RJT05fQ09OVFJPTCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9DT05ORUNUSU9OX0NPTlRST0wgKSkgewoJCQkJbHAtPmNvbm5lY3Rpb25Db250cm9sID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MICk7CgkJCX0KCQl9CgoJCS8qIE5lZWQgdG8gYWRkPyA6IFByb2JlIERhdGEgUmF0ZSAqLwoJfQojZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgKi8KCgkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gQVAgbW9kZSAqLwojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAoJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAoJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CgkJaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fT1dOX0RUSU1fUEVSSU9EICkgewoJCQkJbHAtPkRUSU1QZXJpb2QgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JFSkVDVF9BTlksIHZhbHVlICk7CgkJCWxwLT5SZWplY3RBbnkgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVEICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsIHZhbHVlICk7CgkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsIHZhbHVlICk7CgkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOwoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVkgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCB2YWx1ZSApOwoJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9CRUFDT05fSU5URVJWQUwgKSB7CgkJCQlscC0+b3duQmVhY29uSW50ZXJ2YWwgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQ09FWElTVEVOQ0UgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQ09FWElTVEVOQ0UsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQ09FWElTVEVOQ0UgKSB7CgkJCQlscC0+Y29leGlzdGVuY2UgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9DT0VYSVNURU5DRSApOwoJCQl9CgkJfQoKI2lmZGVmIFVTRV9XRFMKCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgewoJCQkJbHAtPndkc19wb3J0WzFdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CgkJCQlscC0+d2RzX3BvcnRbMl0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKCQkJCWxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCApOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1ICkgPT0gMCApIHsKCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCB2YWx1ZSApOwoKCQkJdmFsdWVfY29udmVydCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgewoJCQkJbHAtPndkc19wb3J0WzRdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CgkJCX0gZWxzZSB7CgkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1ICk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYsIHZhbHVlICk7CgoJCQl2YWx1ZV9jb252ZXJ0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsIE5VTEwsIDApOwoJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CgkJCQlscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMSApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMSwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTEgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMiwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTIgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMyApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMywgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTMgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNCApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNCwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTQgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNSApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNSwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTUgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNiApID09IDAgKSB7CgkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNiwgdmFsdWUgKTsKCgkJCXZhbHVlX2NvbnZlcnQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CgkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKCQkJCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKCQkJfSBlbHNlIHsKCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTYgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxLCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyLCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MzLCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbMl0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0LCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M1LCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUgKTsKCQkJfQoJCX0KCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYgKSA9PSAwICkgewoJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M2LCB2YWx1ZSApOwoKCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgewoJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbNV0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOwoJCQl9IGVsc2UgewoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYgKTsKCQkJfQoJCX0KI2VuZGlmICAvKiBVU0VfV0RTICovCgl9CiNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCgoJcmV0dXJuOwp9IC8vIHRyYW5zbGF0ZV9vcHRpb24KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXBhcnNlX21hY19hZGRyZXNzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwYXJzZSBhIG1hYyBhZGRyZXNzIHN0cmluZyBhbmQgY29udmVydCBpdCB0byBhIGJ5dGUKICogICBhcnJheS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdmFsdWUgICAgICAgLSB0aGUgTUFDIGFkZHJlc3MsIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nCiAqICAgICAgYnl0ZV9hcnJheSAgLSB0aGUgTUFDIGFkZHJlc3MsIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSBhcnJheSBvZiBsZW5ndGgKICogICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpbmFsIE1BQyBhZGRyZXNzLCBzaG91bGQgZXF1YWwgdG8gRVRIX0FMRU4uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBwYXJzZV9tYWNfYWRkcmVzcyggY2hhciAqdmFsdWUsIHVfY2hhciAqYnl0ZV9hcnJheSApCnsKCWludCAgICAgdmFsdWVfb2Zmc2V0ID0gMDsKCWludCAgICAgYXJyYXlfb2Zmc2V0ID0gMDsKCWludCAgICAgZmllbGRfb2Zmc2V0ID0gMDsKCWNoYXIgICAgYnl0ZV9maWVsZFszXTsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgltZW1zZXQoIGJ5dGVfZmllbGQsICdcMCcsIDMgKTsKCgl3aGlsZSggdmFsdWVbdmFsdWVfb2Zmc2V0XSAhPSAnXDAnICkgewoJCS8qIFNraXAgb3ZlciB0aGUgY29sb24gY2hhcnMgc2VwZXJhdGluZyB0aGUgYnl0ZXMsIGlmIHRoZXkgZXhpc3QgKi8KCQlpZiAoIHZhbHVlW3ZhbHVlX29mZnNldF0gPT0gJzonICkgewoJCQl2YWx1ZV9vZmZzZXQrKzsKCQkJY29udGludWU7CgkJfQoKCQlieXRlX2ZpZWxkW2ZpZWxkX29mZnNldF0gPSB2YWx1ZVt2YWx1ZV9vZmZzZXRdOwoJCWZpZWxkX29mZnNldCsrOwoJCXZhbHVlX29mZnNldCsrOwoKCQkvKiBPbmNlIHRoZSBieXRlX2ZpZWxkIGlzIGZpbGxlZCwgY29udmVydCBpdCBhbmQgc3RvcmUgaXQgKi8KCQlpZiAoIGZpZWxkX29mZnNldCA9PSAyICkgewoJCQlieXRlX2ZpZWxkW2ZpZWxkX29mZnNldF0gPSAnXDAnOwoJCQlieXRlX2FycmF5W2FycmF5X29mZnNldF0gPSBzaW1wbGVfc3RydG91bCggYnl0ZV9maWVsZCwgTlVMTCwgMTYgKTsKCQkJZmllbGRfb2Zmc2V0ID0gMDsKCQkJYXJyYXlfb2Zmc2V0Kys7CgkJfQoJfQoKCS8qIFVzZSB0aGUgYXJyYXlfb2Zmc2V0IGFzIGEgY2hlY2s7IDYgYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlCgkgICBieXRlX2FycmF5ICovCglyZXR1cm4gYXJyYXlfb2Zmc2V0Owp9IC8vIHBhcnNlX21hY19hZGRyZXNzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglQYXJzZUNvbmZpZ0xpbmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUGFyc2VzIGEgbGluZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaW50byBhbiBMLXZhbCBhbmQgYW4gUi12YWwsCiAqICByZXByZXNlbnRpbmcgYSBrZXkvdmFsdWUgcGFpci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcHN6TGluZSAgICAgLSB0aGUgbGluZSBmcm9tIHRoZSBjb25maWcgZmlsZSB0byBwYXJzZQogKiAgICAgIHBwc3pMVmFsICAgIC0gdGhlIHJlc3VsdGluZyBMLXZhbCAoS2V5KQogKiAgICAgIHBwc3pSVmFsICAgIC0gdGhlIHJlc3VsdGluZyBSLXZhbCAoVmFsdWUpCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIFBhcnNlQ29uZmlnTGluZSggY2hhciAqcHN6TGluZSwgY2hhciAqKnBwc3pMVmFsLCBjaGFyICoqcHBzelJWYWwgKQp7CglpbnQgaTsKCWludCBzaXplOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAiUGFyc2VDb25maWdMaW5lIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJLyogZ2V0IGEgc25hcHNob3Qgb2Ygb3VyIHN0cmluZyBzaXplICovCglzaXplICAgICAgPSBzdHJsZW4oIHBzekxpbmUgKTsKCSpwcHN6TFZhbCA9IE5VTEw7CgkqcHBzelJWYWwgPSBOVUxMOwoKCWlmICggcHN6TGluZVswXSAhPSAnIycgJiYJCQkJCQkJLyogc2tpcCB0aGUgbGluZSBpZiBpdCBpcyBhIGNvbW1lbnQgKi8KCQkgcHN6TGluZVswXSAhPSAnXG4nJiYJCQkJCQkJLyogaWYgaXQncyBhbiBlbXB0eSBVTklYIGxpbmUsIGRvIG5vdGhpbmcgKi8KCQkgISggcHN6TGluZVswXSA9PSAnXHInICYmIHBzekxpbmVbMV0gPT0gJ1xuJyApCS8qIGlmIGl0J3MgYW4gZW1wdHkgTVMtRE9TIGxpbmUsIGRvIG5vdGhpbmcgKi8KCSAgICApIHsKCQkvKiBhZHZhbmNlIHBhc3QgYW55IHdoaXRlc3BhY2UsIGFuZCBhc3NpZ24gdGhlIEwtdmFsdWUgKi8KCQlmb3IoIGkgPSAwOyBpIDwgc2l6ZTsgaSsrICkgewoJCQlpZiAoIHBzekxpbmVbaV0gIT0gJyAnICkgewoJCQkJKnBwc3pMVmFsID0gJnBzekxpbmVbaV07CgkJCQlicmVhazsKCQkJfQoJCX0KCQkvKiBhZHZhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGwtdmFsdWUqLwoJCWZvciggaSsrOyBpIDwgc2l6ZTsgaSsrICkgewoJCQlpZiAoIHBzekxpbmVbaV0gPT0gJyAnIHx8IHBzekxpbmVbaV0gPT0gJz0nICkgewoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJCQlicmVhazsKCQkJfQoJCX0KCQkvKiBtYWtlIGFueSB3aGl0ZXNwYWNlIGFuZCB0aGUgZXF1YWwgc2lnbiBhIE5VTEwgY2hhcmFjdGVyLCBhbmQKCQkgICBhZHZhbmNlIHRvIHRoZSBSLVZhbHVlICovCgkJZm9yKCBpKys7IGkgPCBzaXplOyBpKysgKSB7CgkJCWlmICggcHN6TGluZVtpXSA9PSAnICcgfHwgcHN6TGluZVtpXSA9PSAnPScgKSB7CgkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCSpwcHN6UlZhbCA9ICZwc3pMaW5lW2ldOwoJCQlicmVhazsKCQl9CgkJLyogbWFrZSB0aGUgbGluZSBlbmRpbmcgY2hhcmFjdGVyKHMpIGEgTlVMTCAqLwoJCWZvciggaSsrOyBpIDwgc2l6ZTsgaSsrICkgewoJCQlpZiAoIHBzekxpbmVbaV0gPT0gJ1xuJyApIHsKCQkJCXBzekxpbmVbaV0gPSAnXDAnOwoJCQl9CgkJCWlmICgoIHBzekxpbmVbaV0gPT0gJ1xyJyApICYmICggcHN6TGluZVtpKzFdID09ICdcbicgKSkgewoJCQkJcHN6TGluZVtpXSA9ICdcMCc7CgkJCX0KCQl9Cgl9CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKfSAvLyBQYXJzZUNvbmZpZ0xpbmUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNlbmRpZiAgLy8gVVNFX1BST0ZJTEUK